/**
 * 定义 SCRM 对接规范（仅用于体现规范，实际对接应使用封装过的 services/scrm）
 * https://ll64kbqo4j.feishu.cn/docx/BVKIdQ3Sjo2n3mxFxrYcM33tntd
 */
import { getLogger } from '@gnlab/utils'
import config from '@/config'

const logger = getLogger('lib/scrm')

export const inSCRM = location.search.includes('scrm=1')

// SCRM 需要用域名访问，其内嵌的 QunTool 也是挂在这个域名下的，且通过 Nginx 配置了到原网址的反向代理。
// 此时访问路径固定是 /quntool-api/，且需要应用与 SCRM 约定好的配置（如 MQTT 连接网址）
// 注意：不是只有处于 iframe 内嵌状态时要应用与 SCRM 约定的配置，而是只要处于这个路径就应用 SCRM 配置，所以此值与 inSCRM 无关。
export const useSCRMConfig = location.pathname.startsWith('/quntool-api')

export interface SCRMMessage<T = unknown> {
  from: 'scrm'
  type: string
  data: T
}

export function listenSCRMMessage(callback: (message: SCRMMessage) => void) {
  window.addEventListener('message', ({ data: raw }) => {
    if (typeof raw !== 'object' || raw === null || (raw as Record<string, unknown>).from !== 'scrm')
      return
    const message = raw as SCRMMessage
    logger.debug('receive', message)
    callback(message)
  })
}

export function sendToSCRM(type: string, data: unknown) {
  const message = { from: 'quntool', type, data }
  logger.debug('send', message)
  window.parent.postMessage(message, '*')
}

/**
 * 确认 SCRM 部署状态
 *
 * 返回值：
 * null        未部署，当前服务器环境未部署 SCRM，或无法通过约定好的网址访问（例如客户自己搞了个域名做反向代理）
 * { url: 'http://111.111.11.111:123', hasDomain: false }    已部署，但尚未配置域名，需要通过当前 IP 访问 SCRM 完全域名配置
 * { url: 'http://abc.com', hasDomain: true }                已部署，且已配置域名，通过域名访问 SCRM
 */
export async function confirmSCRMStatus(token: string) {
  // SCRM 内嵌访问，不用再检查 SCRM 状态
  if (inSCRM) return null

  // 在 SCRM 环境下，但是是独立访问的
  if (useSCRMConfig) return { url: location.origin, hasDomain: true }

  // config 里预先指定了网址
  if (config.SCRM_URL !== null) return { url: config.SCRM_URL, hasDomain: config.SCRM_HAS_DOMAIN }

  // 尝试读取 SCRM 配置
  const scrmBareURL = `${location.protocol}//${location.hostname}:9001`
  const configURL = `${scrmBareURL}/api/common/config/get`
  const jumpPath = `/user/login?token=${token}`
  try {
    const res = await fetch(configURL, {
      headers: { token },
    })
    if (res.status === 200) {
      const data = (await res.json()) as {
        code: number
        msg: string
        debug_msg: string
        data: { callback_host: string }
      }
      if (data.code === 0) {
        return data.data.callback_host
          ? { url: `${data.data.callback_host}${jumpPath}`, hasDomain: true }
          : { url: `${scrmBareURL}${jumpPath}`, hasDomain: false }
      } else {
        logger.error(data)
        return { url: `${scrmBareURL}${jumpPath}`, hasDomain: false }
      }
    } else {
      logger.error('SCRM config 接口报错', await res.text())
      return null
    }
  } catch (e) {
    logger.error('请求 SCRM config 接口失败', e)
    return null
  }
}
